#ifndef DSPSIMULATOR_DSPINSTRUCTION_H
#define DSPSIMULATOR_DSPINSTRUCTION_H

#include <llvm/IR/LLVMContext.h>
#include <llvm/IR/Module.h>
#include <llvm/IR/IRBuilder.h>
#include <simulatorV1/ast/programNode.h>
#include <simulatorV1/ast/constantNode.h>
#include <simulatorV1/ast/regNode.h>
#include <simulatorV1/instruction/instructionInformat.h>
#include <simulatorV1/bitTools/bitTools.h>

class DspInstruction {
protected:
    InstFormat m_instFormat;    // 指令格式
public:
    DspInstruction() = default;

    virtual ~DspInstruction() = default;

    /**
     * @param functionNode functionNode对象为一个指令函数的实例
     * @return 检查functionNode是否符合该指令的格式，如果符合，返回true，否则返回false
     */
    virtual bool checkFormat(std::shared_ptr<FunctionNode> functionNode) = 0;

    /**
     * 根据functionNode对象生成ir指令
     * @param functionNode functionNode对象为一个指令函数的实例
     * @param module llvm模块，一个模块相当于一个cpp文件
     * @param irBuilder llvm IR生成工具类
     */
    virtual void generateIR(std::shared_ptr<FunctionNode> functionNode, llvm::Module *module,
                            std::shared_ptr<llvm::IRBuilder<>> irBuilder) = 0;

    /**
     * 获取指令格式的字符串形式
     * @return 指令格式的字符串形式
     */
    virtual std::vector<std::string> formatToString() = 0;
};

#endif //DSPSIMULATOR_DSPINSTRUCTION_H
